// /**********************************************************************
// 参考地址
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/esp8266-publish-mqtt/

// PUBLISH – 发布消息
// 1-5 发布、订阅和取消订阅
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/publish-subscribe-unsubscribe-mqtt-msg/

// topicName – 主题名
// 主题名用于识别此信息应发布到哪一个主题。关于MQTT主题的应用，我们在之前的课程中已经做了详细介绍，在后续课程中我们还会对主题的高级应用进行更加详细的讲解。
// QoS – 服务质量等级
// QoS（Quality of Service）表示MQTT消息的服务质量等级。QoS有三个级别：0、1和2。QoS决定MQTT通讯有什么样的服务保证。有关QoS的详细信息我们会在后续课程中详细讲解。
// packetId – 报文标识符
// 报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。请注意：报文标识符的内容与QoS级别有密不可分的关系。只有QoS级别大于0时，报文标识符才是非零数值。如果QoS等于0，报文标识符为0。
// retainFlag – 保留标志
// 在默认情况下，当客户端订阅了某一主题后，并不会马上接收到该主题的信息。只有在客户端订阅该主题后，服务端接收到该主题的新信息时，服务端才会将最新接收到的该主题信息推送给客户端。
// 但是在有些情况下，我们需要客户端在订阅了某一主题后马上接收到一条该主题的信息。这时候就需要用到保留标志这一信息。关于保留标志的具体使用方法，我们将在本教程的后续部分进行详细讲解。
// Payload – 有效载荷
// 有效載荷是我们希望通过MQTT所发送的实际内容。我们可以使用MQTT协议发送文本，图像等格式的内容。这些内容都是通过有效載荷所发送的。
// dupFlag – 重发标志
// 当MQTT报文的接收方没有及时确认收到报文时，发送方会重复发送MQTT报文。在重复发送MQTT报文时，发送方会将此“重发标志”设置为true。请注意，重发标志只在QoS级别大于0时使用。有关QoS的详细信息，我们将会在后续教程中为您做详细介绍。

// SUBSCRIBE – 订阅主题
// 请留意，一个SUBSCRIBE报文可以包含有单个或者多个订阅主题名。也就是说，一个SUBSCRIBE报文可以用于订阅一个或者多个主题。

// 2. 主题分级
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/mqtt-topics/

// 我们再来看几个分级主题的示例：
// home/sensor/kitchen/temperature
// home/sensor/kitchen/brightness
// home/sensor/bedroom/temperature
// home/sensor/bedroom/brightness

// 3 主题通配符
// 单级通配符: +
// home/sensor/+/temperature
// 当客户端订阅了以上主题后，它将会收到以下主题的信息内容：
// home/sensor/kitchen/temperature
// home/sensor/bedroom/temperature

// 多级通配符 #
// home/sensor/#
// 当客户端订阅了以上含有”#”的主题后，可以收到以下主题的信息。
// home/sensor/kitchen/temperature
// home/sensor/bedroom/brightness
// home/sensor/data

// – 以$开始的主题
// 以$开始的主题是MQTT服务端系统保留的特殊主题，我们不能随意订阅或者向其发布信息。以下是此类主题的示例：
// $SYS/broker/clients/connected
// $SYS/broker/clients/disconnected
// $SYS/broker/clients/total
// $SYS/broker/messages/sent
// $SYS/broker/uptime

// – 不要用 “/” 作为主题开头
// – 主题中不要使用空格
// – 主题中尽量使用ASCII字符


// SUBACK – 订阅确认
// returnCode – 订阅返回码
// 返回码 Return Code Response
// 0 订阅成功 – QoS 0
// 1 订阅成功- QoS 1
// 2 订阅成功- QoS 2
// 128 订阅失败
// UNSUBSCRIBE – 取消订阅


// 发布MQTT消息示例
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/esp8266-publish-mqtt/



// 公用MQTT服务器列表

// 位置导航: 首页 / 零基础入门学用物联网总目录 / MQTT篇目录 /本页

// 然也物联 (国内)

// 官网地址：http://www.ranye-iot.net
// MQTT服务器地址：test.ranye-iot.net
// TCP 端口：1883
// TCP/TLS 端口：8883

// Mosquitto (国外)

// 官网地址：http://www.mosquitto.org
// MQTT服务器地址：test.mosquitto.org
// TCP 端口：1883
// TCP/TLS 端口：8883
// WebSockets 端口：8080
// Websocket/TLS 端口：8081

// HiveMQ (国外)

// 官网地址：https://www.hivemq.com
// MQTT服务器地址：broker.hivemq.com
// TCP 端口：1883
// WebSockets 端口：8000
// ***********************************************************************/
// #include <WiFi.h>
// #include <PubSubClient.h>
// #include <Ticker.h>

// Ticker ticker;
// int count;    // Ticker计数用变量
//  void tickerCount(){
//   count++;
// }

// // 设置wifi接入信息
// WiFiClient wifiClient;
// const char* ssid = "SEVNCE";//WiFi 5G连不上
// const char* password = "qtrj2008";

// //设置mqtt服务器信息
// // 如以上MQTT服务器无法正常连接，请前往以下页面寻找解决方案
// // http://www.taichi-maker.com/public-mqtt-broker/
// const char* mqttServer = "test.ranye-iot.net";
// String mqttClientId  = "huawo_";
// PubSubClient mqttClient(wifiClient);

// // ESP8266连接wifi
// void connectWifi(){
 
//   WiFi.begin(ssid, password);
 
//   //等待WiFi连接,成功连接后输出成功信息
//   while (WiFi.status() != WL_CONNECTED) {
//     delay(1000);
//     Serial.print(".");
//   }
//   Serial.println(""); 
//   Serial.print(ssid);
//   Serial.println(" WiFi connect Success");  
//   Serial.println(""); 
// }

// //连接mqtt服务器
// void connectMQTTServer(){
//   // 根据ESP8266的MAC地址生成客户端ID（避免与其它ESP8266的客户端ID重名）
//   mqttClientId = mqttClientId + WiFi.macAddress();
 
//   // 连接MQTT服务器
//   if (mqttClient.connect(mqttClientId.c_str())) { 
//     Serial.println("MQTT Server connect Success");
//     Serial.println("MQTT Server Address: ");
//     Serial.println(mqttServer);
//     Serial.println("mqttClientId:");
//     Serial.println(mqttClientId);
//   } else {
//     Serial.println("MQTT Server conntect Failed");
//     Serial.println(mqttClient.state());
//     delay(3000);
//   }   
// }
 

// // 发布信息
// void pubMQTTmsg(){
//   static int value; // 客户端发布信息用数字
 
//   // 建立发布主题。主题名称以Taichi-Maker-为前缀，后面添加设备的MAC地址。
//   // 这么做是为确保不同用户进行MQTT信息发布时，ESP8266客户端名称各不相同，
//   String topicString = "HYJ-Pub-" + WiFi.macAddress();
//   char publishTopic[topicString.length() + 1];  
//   strcpy(publishTopic, topicString.c_str());
 
//   // 建立发布信息。信息内容以Hello World为起始，后面添加发布次数。
//   String messageString = "Hello World " + String(value++); 
//   char publishMsg[messageString.length() + 1];   
//   strcpy(publishMsg, messageString.c_str());
  
//   // 实现ESP8266向主题发布信息
//   if(mqttClient.publish(publishTopic, publishMsg)){
//     Serial.println("Publish Topic:");Serial.println(publishTopic);
//     Serial.println("Publish message:");Serial.println(publishMsg);    
//   } else {
//     Serial.println("Message Publish Failed."); 
//   }
// }
 
// void setup() {
//   Serial.begin(9600);
 
//   //设置ESP8266工作模式为无线终端模式
//   WiFi.mode(WIFI_STA);
//   // 连接WiFi
//   connectWifi();
  
//   // 设置MQTT服务器和端口号
//   mqttClient.setServer(mqttServer, 1883);
 
//    // 连接MQTT服务器
//   connectMQTTServer();

//     // Ticker定时对象
//   ticker.attach(1, tickerCount);  

// }
 
// void loop() { 
//   if (mqttClient.connected()) { // 如果开发板成功连接服务器
//     // 每隔3秒钟发布一次信息
//     if (count >= 3){
//       pubMQTTmsg();
//       count = 0;
//     }    
//     // 保持心跳
//     mqttClient.loop();
//   } else {                  // 如果开发板未能成功连接服务器
//     connectMQTTServer();    // 则尝试连接服务器
//   }
// }
 
